package co.edu.javeriana.konigsberg.xavier.servicio;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.ejb.EJB;
import javax.ejb.Stateful;
import javax.ejb.Stateless;

import co.edu.javeriana.konigsberg.xavier.dao.desc.DepartamentoDAOLocal;
import co.edu.javeriana.konigsberg.xavier.dto.DepartamentoDTO;
import co.edu.javeriana.konigsberg.xavier.dto.PaisDTO;
import co.edu.javeriana.konigsberg.xavier.entidad.Departamento;

/**
 * Session Bean implementation class DepartamentoServicio
 */
@Stateless
public class DepartamentoServicio implements DepartamentoServicioRemote, DepartamentoServicioLocal {

	@EJB
	private DepartamentoDAOLocal departamentoDAO;
	
	private static Map<BigInteger, List<DepartamentoDTO>> mapaDepartamentoPorPais;
	private static Map<BigInteger, DepartamentoDTO> mapaDepartamentos;
    /**
     * Default constructor. 
     */
    public DepartamentoServicio() {
        // TODO Auto-generated constructor stub
    }
    
    @Override
    public List<DepartamentoDTO> obtenerLista(){
    	List<Departamento> departamentos = departamentoDAO.obtenerLista();
		List<DepartamentoDTO> departamentoDTOs = new ArrayList<DepartamentoDTO>();
		for (Departamento departamento : departamentos) {
			DepartamentoDTO departamentoDTO = new DepartamentoDTO();
			departamentoDTO.setIdDepartamento(departamento.getIdDepartamento());
			departamentoDTO.setNombreDepartamento(departamento.getNombreDepartamento());
			departamentoDTOs.add(departamentoDTO);
		}
		return departamentoDTOs;
    }
    
    @Override
    public List<DepartamentoDTO> obtenerListaDePadre(PaisDTO paisDTO){
    	if(mapaDepartamentoPorPais == null){
    		mapaDepartamentoPorPais = new HashMap<BigInteger, List<DepartamentoDTO>>();
		}
		if(mapaDepartamentoPorPais.containsKey(paisDTO.getIdPais())){
			return mapaDepartamentoPorPais.get(paisDTO.getIdPais());
		}else{
			if(mapaDepartamentos == null){
				mapaDepartamentos = new HashMap<BigInteger, DepartamentoDTO>();
			}
			List<Departamento> departamentos = departamentoDAO.obtenerListaPorPadre(paisDTO.getIdPais());
			List<DepartamentoDTO> departamentoDTOs = new ArrayList<DepartamentoDTO>();
			for (Departamento departamento : departamentos) {
				DepartamentoDTO departamentoDTO = getDTO(departamento, paisDTO);
				departamentoDTOs.add(departamentoDTO);
				mapaDepartamentos.put(departamentoDTO.getIdDepartamento(), departamentoDTO);
			}
			mapaDepartamentoPorPais.put(paisDTO.getIdPais(), departamentoDTOs);
			return departamentoDTOs;
		}
		
	}

	@Override
	public DepartamentoDTO obtenerDepartamentoPorId(BigInteger id) {
		return mapaDepartamentos.get(id);
	}

	@Override
	public DepartamentoDTO getDTO(Object entidad, PaisDTO paisDTO) {
		Departamento departamento = (Departamento)entidad;
		DepartamentoDTO departamentoDTO = new DepartamentoDTO();
		departamentoDTO.setIdDepartamento(departamento.getIdDepartamento());
		departamentoDTO.setNombreDepartamento(departamento.getNombreDepartamento());
		departamentoDTO.setPaisDTO(paisDTO);
		return departamentoDTO;
	}

}
